import axios from 'axios'
import {
  Message,
  MessageBox
} from 'element-ui';
import store from '../store'
import {
  getToken, setToken
} from 'utils/auth'


/*是否有请求正在刷新token*/
window.isRefreshing = false
/*被挂起的请求数组*/
let refreshSubscribers = []

/*获取刷新token请求的token*/
function getRefreshToken() {
  return JSON.parse(localStorage.auth).refresh_token
}

/*push所有请求到数组中*/
function subscribeTokenRefresh(cb) {
  refreshSubscribers.push(cb)
}


//创建axios实例
const service = axios.create({
  timeout: 1000 * 60
})
/*push所有请求到数组中*/
function subscribeTokenRefresh(cb) {
  refreshSubscribers.push(cb)
}

/*刷新请求（refreshSubscribers数组中的请求得到新的token之后会自执行，用新的token去请求数据）*/
function onRrefreshed(token) {
  refreshSubscribers.map(cb => cb(token))
}
// request拦截器
service.interceptors.request.use(config => {
  // Do something before request is sent
  if (store.getters.token) {
    var data = JSON.parse(getToken());
    var expire = data.expire
    var refresh = data.refesh
    var now = Math.round(new Date().getTime())
    // var companyId = data.companyId
    // var userId = data.userId
    // var userName = data.userName
    //过期,重新登录
    if (now >= expire) {
      router.replace({
        path: '/login'
      })
      return config
    }
    // //在刷新时间内
    // if (now >= refresh && !window.isRefreshing) {
    //   window.isRefreshing = true
    //   const refeshAxios = axios.create({
    //     timeout: 1000 * 60
    //   })
    //   refeshAxios.get(
    //     '/api/user/refreshToken', {
    //     params: {
    //       'companyId': data.companyId,
    //       'userId': data.userId,
    //       'userName': data.userName
    //     },
    //     headers: {
    //       'content-type': 'application/json',
    //       "token": data.token  //token换成从缓存获取
    //     }
    //   }).then(res => {
    //     store.dispatch("refreshToken", res.data)
    //     userName = res.data.data.userName

    //     /*执行数组里的函数,重新发起被挂起的请求*/
    //     onRrefreshed(res.data.data.token)
    //     /*执行onRefreshed函数后清空数组中保存的请求*/
    //     refreshSubscribers = []

    //     isRefreshing = false
    //   })

    //   /*把请求(token)=>{....}都push到一个数组中*/
    //   let retry = new Promise((resolve, reject) => {
    //     /*(token) => {...}这个函数就是回调函数*/
    //     subscribeTokenRefresh((token) => {
    //       config.headers['token'] = token; // 让每个请求携带token--['Authorization']为自定义key 请根据实际情况自行修改
    //       config.headers['companyId'] = companyId
    //       config.headers['userId'] = userId
    //       config.headers['userName'] = userName

    //       /*将请求挂起*/
    //       resolve(config)
    //     })
    //   })
    //   return retry
    // }
    //小于刷新时间
    //else {
    config.headers['token'] = data.token; // 让每个请求携带token--['Authorization']为自定义key 请根据实际情况自行修改
    config.headers['companyId'] = data.companyId
    config.headers['userId'] = data.userId
    config.headers['userName'] = data.userName
    return config
    //}
  }
  return config;
}, error => {
  // Do something with request error
  console.log(error); // for debug
  Promise.reject(error);
})

// respone拦截器
service.interceptors.response.use(
  response => {
    /**
     * 下面的注释为通过response自定义code来标示请求状态，当code返回如下情况为权限有问题，登出并返回到登录页
     * 如通过xmlhttprequest 状态码标识 逻辑可写在下面error中
     */
    const res = response.data;
    if (res.status === 401) {
      MessageBox.confirm('你已被登出，可以取消继续留在该页面，或者重新登录', '确定登出', {
        confirmButtonText: '重新登录',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        store.dispatch('FedLogOut').then(() => {
          location.reload(); // 为了重新实例化vue-router对象 避免bug
        });
      })
      return Promise.reject('error');
    }
    if (res.status === 40301) {
      Message({
        message: '当前用户无相关操作权限！',
        type: 'error',
        duration: 5 * 1000
      });
      return Promise.reject('error');
    }
    if (res.status === 400) {
      Message({
        message: res.message,
        type: 'warning'
      });
      return Promise.reject('error');
    }
    if (res.status !== 200) {
      Message({
        message: res.message,
        type: 'error',
        duration: 5 * 1000
      });
    } else {
      return res;
    }
  },
  error => {
    // console.log(error); // for debug
    Message({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    });
    return Promise.reject(error);
  }
);

export default service;